/* 
	上传文件工具类
 */
import request from "@/utils/request.js";
import {
	FILE_CHUNK_SIZE,
	HTTP_BASE_URL
} from "@/config/global.js";
import {
	uploadBySingle
} from "@/api/upload.js";
import {
	message
} from "@/utils/tools.js";

/**
 * 文件切片(仅限APP端使用)
 * @param {Object} path
 * @returns {ok: true | false, ...}
 */
export const splitFile = function(path) {
	// #ifdef APP-PLUS
	return new Promise((resolve, reject) => {
		plus.io.resolveLocalFileSystemURL(path, entry => {
			entry.file(file => {
				// 文件大小
				const fileSize = file.size;
				// 获取文件名字
				const fileName = file.name;
				let fileNameArr = fileName.split("\.");
				// 获取文件后缀名
				const suffix = fileNameArr[fileNameArr.length - 1];
				
				// 切片数量
				const chunks = Math.ceil(fileSize / FILE_CHUNK_SIZE);
				// 定义切片数组
				let chunkFile = [];
				for(let i = 0; i < chunks; i++) {
					let chunk = file.slice(i * FILE_CHUNK_SIZE, (i + 1) * FILE_CHUNK_SIZE);
					chunkFile.push({
						file: chunk,
						fileSize,
						suffix,
						chunk: i,
						chunkSize: FILE_CHUNK_SIZE,
						chunks
					})
				}
				
				return resolve({
					data: chunkFile,
					ok: true,
					message: '文件切片成功！'
				});
			}, err => reject({ok: false, message: err}));
		}, err => reject({ok: false, message: err}));
	})
	// #endif
	
	// #ifndef APP-PLUS
	return Promise.reject({ok: false, message: "非APP端不可使用该方法！"});
	// #endif
}


/**
 * 获取文件后缀名
 * @param {Object} file
 */
function getSuffix(file) {
	// 获取文件名字
	const fileName = file.name;
	let fileNameArr = fileName.split("\.");
	// 获取文件后缀名
	const suffix = fileNameArr[fileNameArr.length - 1];
	return suffix;
}

/**
 * 合并成完整的后台文件路径
 * @param {Object} backPath
 */
export const mergeBackPath = function(backPath) {
	const path = HTTP_BASE_URL.substring(0, HTTP_BASE_URL.length - 1);
	return path + backPath;
} 

/**
 * 利用单文件上传接口做多文件上传
 * @param {Object} files
 */
export const mutiUploadFile = async function(files, check = checkType) {
	
	let fileList = [];
	for (let i = 0; i < files.length; i++) {
		// #ifdef H5
		const suffix = getSuffix(files[i]);
		// 检查文件类型
		if(check && !check(suffix)) {
			console.error("存在文件非允许类型");
			message("上传文件中存在非允许类型，已跳过该文件上传！");
			continue;
		}
		const backData = await uploadBySingle(
								"file",
								{suffix},
								files[i].path
							);
		// #endif
		
		// #ifndef H5
		if(!files[i].path) {
			console.error("参数传递错误，请传递res.tempFiles");
			return fileList;
		}
		const suffix = getSuffix({name: files[i].path});
		// 检查文件类型
		if(check && !check(suffix)) {
			console.error("存在文件非允许类型");
			message("上传文件中存在非允许类型，已跳过该文件上传！");
			continue;
		}
		const backData = await uploadBySingle(
								"file",
								{suffix},
								files[i].path
							);
		// #endif
		
		if(backData.ok) fileList.push(backData.data);					
	}
	
	return fileList;
}

/**
 * 检查文件类型
 * @param suffix
 * @param arrow
 */
function checkType(suffix, arrow = [
	'xbm','avif',
	'tif','pjp',
	'.svgz','jpg',
	'jpeg','ico',
	'tiff','gif',
	'svg','jfif',
	'webp','png',
	'.bmp','pjpeg'
]) {
	if(arrow.indexOf(suffix) == -1) return false;
	return true;
}
